如昨天所提,一台自走車可以接收很多種感測器回傳的資訊,IMU提供旋轉與位移資訊、相機提供真實世界的影像、光達可以提供三維點雲資訊。那我們要怎麼有效地將資訊再發送到自走車系統中的各項節點去做運算,讓自走車充分了解自身所處環境,成功做到「感知(定位、物體辨識、物體追蹤)」的目標?有許多函式庫已經提供我們各種常見的演算法來達成此目標了。
我們可以透過深度相機(攝影機)得到道路或交通號誌的影像,可以是影片檔或是圖片檔。
Open Source Computer Vision Library是開源的電腦視覺函式庫,可以在各大作業系統平台上運作,可用於即時的圖像處理、電腦視覺以及圖型識別程式,是最常見的影像處理函式庫,具體的功能有人臉辨識、影像的特徵萃取與拼接、車道邊緣偵測、影像矩陣運算等等。
例如:在自走車的應用中,可以將取得的影像先做邊緣偵測後,在透過之後會介紹的霍夫轉換去做線型偵測,可以得到辨識出車道線的效果。
The Point Cloud Library是處理點雲的開源函式庫,可以處理二維或三維的大量點雲資訊,支援跨平台。PCL包含許多的過濾、特徵估計、表面重建、配準、模型擬合和分割等演算法,如同openCV一樣,PCL也有自己的邊緣偵測及尋找線性的演算法。順帶一提,還有一個函式庫可以處理點雲--open3D,不過點雲只是他其中一個功能,更多是的其他3D的功能,沒有接觸所以就小小提一下就好。
PCL是我的主力工具,目前用它做點雲的輸入輸出、預處理(雜訊濾除)、邊緣偵測、隧道線型偵測(最小二次法、RANSAC、霍夫轉換擇一,但之後都會介紹)、點雲可視化。
來源:我自己
說明:部分的隧道線型辨識過程。用到歐基里德分簇演算法、直線辨識演算法PCL歐基里德分簇的函式
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance (0.02); // 2cm
ec.setMinClusterSize (100);
ec.setMaxClusterSize (25000);
ec.setSearchMethod (tree);
ec.setInputCloud (cloud_filtered);
ec.extract (cluster_indices);
CloudCompare是一款3D點雲處理軟體,如果你只是想要做簡單的視覺化、量測測距離、ICP等等不會過度複雜的處理,那可以先用CloudCompare就好。
有了上述工具後也還沒完全做完感知的動作,感知很大的一個環節是定位,而定位需要產生高精度地圖,有了以上的工具在搭配上ROS的packages才能好好實踐定位功能,ROS也能透過packages做決策的動作,一樣先留些坑。